#进程：介绍、创建、通信、进程池

#一、进程介绍
'''
进程：一个程序运行起来后，代码加用到的资源，称之为进程，
它是操作系统分配资源的基本单位。（运行中的程序）

不仅可以通过线程完成多任务，进程也可以。

进程是资源分配的最小单位，线程是CPU调度的最小单位。

'''
#进程的各种状态
import time
print('同学们上课啦')  #程序开始，运行状态
name = input('输入你的姓名：') #用户输入，进入阻塞
print(name)  #运行状态
time.sleep(2) #睡眠2s，阻塞状态
print('同学们下课啦') #运行状态
print('=====================================================')
print('\n')

#multiprocessing模块提供了一个Process类
'''
Process类的参数说明：
1.Process([group[,target[,name[,args[,kwargs]]]]])
2.target 表示调用对象，即子进程执行的任务
3.args 给target指定的函数传递的参数  #元组的方式传递
4.kwargs 表示调用字典对象
5.name 子进程名称
6.group 指定进程组

常用属性：
1.name 当前进程的别名，默认Process-N，N从1开始递增的整数
2.pid  进程号
3.ppid 父进程号

'''


#二、进程创建
'''
os  模块是多种操作系统模块


查看当前进程
import os
os.getpid

查看当前父进程
import os
os.getppid

'''
#创建进程简单实例
import os
from multiprocessing import Process
def one():
    #os.getpid获取当前进程的进程号
    print('one子进程id:%s,父进程di:%s'%(os.getpid(),os.getppid()))

def two():
    print('two子进程id:%s,父进程di:%s'%(os.getpid(),os.getppid()))

if __name__=='__main__':
    #创建子进程
    p1 = Process(target=one)
    p2 = Process(target=two)

    #启动进程
    p1.start()
    p2.start()

    #修改进程名
    p1.name = 'Telli'
    print('p1的子进程名是：',p1.name)
    p2.name = 'Six'
    print('p2的子进程名是：',p2.name)

    print('主进程：%s,父进程：%s'%(os.getpid(),os.getppid()))
print('=====================================================')
print('\n')

#进程常用的方法
'''
start()  启动进程实例
is_alive()  判断子进程是否还活着，存活返回True否则是False
join([timeout]) 是否等待子进程执行结束（阻塞主进程）timeout 为等待时长
terminate()  不管任务是否完成，立即终止子进程。
子进程创建需要时间，在这个空闲时间，父进程继续执行代码。

'''
from multiprocessing import Process
def sing(name1):
    print(f'{name1}唱歌唱出了诗歌声')

def dance(name2):
    print(f'{name2}跳舞跳出了国际范')

if __name__=='__main__':

    p1 = Process(target=sing,args=('Lucy',))
    p2 = Process(target=dance,args=('Telli',))

    #启动进程
    p1.start()
    p1.join()    #阻塞主进程，等待子进程执行。
    p2.start()
    p2.join()

    print('p1的状态是：',p1.is_alive())
    print('p2的状态是：',p2.is_alive())
print('=====================================================')
print('\n')

#进程间不能共享全局变量
from multiprocessing import Process
import time
list1 = []   #全局变量

def funa():
    for i in range(3):
        list1.append(i)
        time.sleep(1)
        print('这是funa子进程中的：',list1)

def funb():
    print('这是funb子进程中的：',list1)

if __name__=='__main__':
    p1 = Process(target=funa)
    p2 = Process(target=funb)

    #启动进程
    p1.start()
    p2.start()
print('=====================================================')
print('\n')

#进程、线程相同点：
'''
进程能够完成多任务，如同一台电脑上可以同时运行多个软件
线程能够完成多任务，如某个软件打开的多个窗口

'''
#进程、线程的区别
'''
线程资源可共享，进程间资源不共享；
一个程序至少有一个进程，一个进程至少有一个线程
线程划分尺度小于进程，多线程程序并发性高。
进程在执行过程中拥有独立的内存单元。
线程不能独立执行，必须依存在进程中。

'''
#计算密集型：计算量比较大时（如复杂运算）用多进程
#IO密集型：如爬虫、文件读写 用多线程


